// middleware中间件
// 客户 -> 中介 -> 房东
// 中间件也叫拦截器,执行目标程序之前,先执行的程序
// 前端发送请求 -> 后端接收请求 -> 匹配请求路径 -> 执行请求处理函数 -> 响应前端
// 前端发送请求 -> 后端接收请求 -> 匹配请求路径 -> 中间件函数 -> 执行请求处理函数 -> 响应前端

// 加载模块
let express = require('express')
// 创建实例
let app = express()

// express框架的三种中间件:
// 1.express内置中间件(express.static)
// 2.第三方中间件(body-parser)
// 3.自定义中间件

// 自定义中间件: 全局中间件 和 局部中间件
// 在express中的中间件是一个函数

// 使用插件(中间件)
// app.use(path,fn)
// path 路径的开头部分,默认为 '/'
// fn 请求路径中开头为path时,执行的函数

// 全局中间件
app.use('/',(req,res,next)=>{// 中间件函数(拦截器)
    console.log( '全局中间件' )
    // req 请求相关的对象
    // res 响应相关的对象
    // next 是一个函数,执行后才会继续后面的程序(放行)
    let {token} = req.query
    if (token === 'abc123') {
        next()// 继续之后后面程序
    } else {
        res.send({"err":0,"msg":"token验证失败"})
    }
})

// 需求:请求 /a /b /c 接口时,必须都传token已登录的标识

app.get('/a',(req,res)=>{// 请求处理函数
    // let {token} = req.query
    // if (token === 'abc123') {
    //     res.send({"err":1,"msg":"获取购物车数据成功"})
    // } else {
    //     res.send({"err":0,"msg":"token验证失败"})
    // }

    res.send({"err":1,"msg":"获取购物车数据成功"})
})
app.get('/b',(req,res)=>{// 请求处理函数
    // let {token} = req.query
    // if (token === 'abc123') {
    //     res.send({"err":1,"msg":"获取地址列表数据成功"})
    // } else {
    //     res.send({"err":0,"msg":"token验证失败"})
    // }

    res.send({"err":1,"msg":"获取地址列表数据成功"})
})

// 局部中间件
// 请求 /c 时,除了要验证token,还要验证手机验证码code
// app.get(path,fn1,fn2)
// path 要匹配的路径
// fn1 局部中间件函数
// fn2 请求处理函数
app.get('/c',(req,res,next)=>{// 中间件函数(拦截器)
    console.log( '局部中间件' )
    // req 请求相关的对象
    // res 响应相关的对象
    // next 是一个函数,执行后才会继续后面的程序(放行)
    let {code} = req.query
    if (code === '666') {
        next()// 继续执行后面的程序(放行)
    } else {
        res.send({"err":-1,"msg":"手机验证码错误"})
    }
},(req,res)=>{// 请求处理函数
    // let {token} = req.query
    // if (token === 'abc123') {
    //     res.send({"err":1,"msg":"获取用户数据成功"})
    // } else {
    //     res.send({"err":0,"msg":"token验证失败"})
    // }

    res.send({"err":1,"msg":"获取用户数据成功"})
})

// 监听端口
app.listen(3005,()=>{
    console.log( '------服务启动成功------' )
})
// 服务地址:http://localhost:3005/
